import axios from 'axios';

let cancel, promiseArr = {};

const CancelToken = axios.CancelToken;
// 请求拦截器
axios.interceptors.request.use(config => {
    //发起请求时，取消掉当前正在进行的相同请求
    if (promiseArr[config.url]) {
        promiseArr[config.url]('操作取消');
        promiseArr[config.url] = cancel;
    } else {
        promiseArr[config.url] = cancel;
    }
    return config;
}, error => {
    // 返回报错信息
    return Promise.reject(error)
});

// 响应拦截器
axios.interceptors.response.use(
    response => {
        // 返回数据
        return response.data
    },
    err => {
        // 对状态码做相应的处理
        if (err && err.response) {
            switch (err.response.status) {
                case 400:
                    err.msg = '错误请求';
                    break;
                case 401:
                    err.msg = '未授权，请重新登录';
                    break;
                case 403:
                    err.msg = '拒绝访问';
                    break;
                case 404:
                    err.msg = '请求错误,未找到该资源';
                    break;
                case 405:
                    err.msg = '请求方法未允许';
                    break;
                case 408:
                    err.msg = '请求超时';
                    break;
                case 500:
                    err.msg = '服务器端出错';
                    break;
                case 501:
                    err.msg = '网络未实现';
                    break;
                case 502:
                    err.msg = '网络错误';
                    break;
                case 503:
                    err.msg = '服务不可用';
                    break;
                case 504:
                    err.msg = '网络超时';
                    break;
                case 505:
                    err.msg = 'http版本不支持该请求';
                    break;
                default:
                    err.msg = `连接错误${err.response.status}`;
            }
        }else{
            // 请求没有发送就没有错误信息
            err.msg = "连接到服务器失败"
        }
        // 错误请求码
        err.code = -1;
        // 返回错误的信息
        return Promise.resolve(err);
    }
)

//请求的默认前缀 只要是发出去请求就会 默认带上这个前缀(在跨域配置里设置的前缀)
axios.defaults.baseURL = '/shop'

//设置默认请求头 异步的
axios.defaults.headers = {
    'X-Requested-With': 'XMLHttpRequest'
}

//设置超时请求时间
axios.defaults.timeout = 8000;

/**
 * 
 * @param {*} data 数据 
 * @returns 返回数据或错误信息
 */
let GET = (data = {}) => {
    return new Promise((resolve,reject) => {
        axios({
            method: 'get',
            url:data.url,
            params: data.params,
            cancelToken: new CancelToken(c => cancel = c)
        }).then(res => resolve(res)).catch(err => reject(err));
    })
}

//post请求 和上同
let POST = (data = {}) => {
    return new Promise((resolve,reject) => {
        axios({
            method: 'post',
            url:data.url,
            data:data.params,
            cancelToken: new CancelToken(c => cancel = c)
        }).then(res => resolve(res)).catch(err => reject(err));
    })
}

//post请求 和上同
let UPLOADS = (data = {}) => {
    return new Promise((resolve,reject) => {
        axios({
            method: 'post',
            url:data.url,
            data:data.params,
            headers:{'Content-Type': 'multipart/form-data'},
            cancelToken: new CancelToken(c => cancel = c)
        }).then(res => resolve(res)).catch(err => reject(err));
    });
}


// 文件上传请求
let UPLOAD = (data = {}) =>
{
  //封装表单数据对象
  var RequestData = new FormData()

  if(JSON.stringify(data.params) != "{}")
  {
    for(var key in data.params)
    {
      RequestData.append(key, data.params[key])
    }
  }

  return new Promise((resolve,reject) => {
    axios({
      method: 'post',
      url:data.url,
      data:RequestData,
      headers:{'Content-Type': 'multipart/form-data'},
      cancelToken: new CancelToken(c => {
        cancel = c
      })
    }).then(res => resolve(res)).catch(err => reject(err));
  })
}

export {
    GET,
    POST,
    UPLOAD,
    UPLOADS
}